home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / ariawave / wave.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-06  |  1.8 KB  |  66 lines

  1. /* WAVE.C v0.01 */
  2.  
  3. #include <stdio.h>
  4. #include <io.h>
  5. #include <unistd.h>
  6. #include <std.h>
  7. #include <stdlib.h>
  8. #include "wave.h"
  9.  
  10. #define memeql(s1,s2,n) (!memcmp(s1,s2,n))
  11.  
  12. unsigned short *get_wav_data(unsigned *format, char *Name)
  13. {
  14.     int handle;
  15.     char buffer[25];
  16.     short shortbuf;
  17.     unsigned short *data = NULL;
  18.     int i;
  19.     int *length=0;
  20.     unsigned long *rate=0;
  21.     div_t temp;
  22.     unsigned local_format=0;
  23.  
  24.     if((handle = open(Name,O_RDONLY|O_BINARY)) == -1)
  25.     return(NULL);
  26.     /* is it a file in "RIFF WAVE fmt" format ? */
  27.     /*      there's 4 bytes of rLen in between, not used here */
  28.     read(handle,buffer,16);
  29.     if(!(memeql(buffer,"RIFF",4) && memeql(&(buffer[8]),"WAVEfmt ",8))) {
  30.     goto EndFunc;
  31.     }
  32.     read(handle,&i,4);                   /* start of data from here */
  33.     read(handle,&shortbuf,2);
  34.     if(shortbuf != 1) {                  /* ID for PCM-files        */
  35.     goto EndFunc;
  36.     }
  37.     read(handle,&shortbuf,2);
  38.     if(shortbuf != 1 && shortbuf != 2) { /* Neither mono nor stereo */
  39.     goto EndFunc;
  40.     }
  41.     local_format=shortbuf;
  42.     read(handle,rate,4);
  43.     read(handle,&shortbuf,2);            /* Skip 6 bytes */
  44.     read(handle,&shortbuf,2);
  45.     read(handle,&shortbuf,2);
  46.     read(handle,&shortbuf,2);            /* Read number of bits per sample */
  47.  
  48.     local_format+=(((shortbuf/8)-1)*2)-1;
  49.     temp=div(*rate,22050);
  50.     local_format+=(16*temp.quot);
  51.  
  52.     read(handle,buffer,4);
  53.     if(!memeql(buffer,"data",4)) {       /* must be data block */
  54.     goto EndFunc;
  55.     }
  56.     read(handle,length,4);               /* actual data length */
  57.     aria_samplesize=(unsigned int) *length;
  58.     data = (unsigned short *) malloc(aria_samplesize);
  59.     if(data)
  60.       read(handle,data,aria_samplesize);
  61.     *format=local_format;
  62. EndFunc:
  63.      close(handle);
  64.      return(data);
  65. }
  66.